#import "SQLHelper.h"

@implementation SQLiteStatement

//
// init with statement
//
- (id)initWithStatement:(sqlite3_stmt*)statement
{
	//
	// call super
	//
	self																	= [super init];
	if(!self)
		return nil;
	
	_statement																= statement;
	
	return self;
}

//
// dealloc
//
- (void)dealloc
{
	[self close];
	
	[super dealloc];
}

//
// fetch
//
- (BOOL)fetch
{
	return _statement && sqlite3_step(_statement) == SQLITE_ROW;
}

//
// close
//
- (void)close
{
	if(_statement)
		sqlite3_finalize(_statement);
	
	_statement																= 0;
}

//
// is null
//
- (BOOL)isNull:(int)column
{
	return !_statement || sqlite3_column_type(_statement, column) == SQLITE_NULL;
}

//
// int value
//
- (int)intValue:(int)column
{
	return _statement ? sqlite3_column_int(_statement, column) : 0;
}

//
// int64 value
//
- (int64_t)int64Value:(int)column
{
	return _statement ? sqlite3_column_int64(_statement, column) : 0;
}

//
// double value
//
- (double)doubleValue:(int)column
{
	return _statement ? sqlite3_column_double(_statement, column) : 0;
}

//
// string value
//
- (NSString*)stringValue:(int)column
{
	uint8_t const* sqliteValue												= _statement ? sqlite3_column_text(_statement, column) : 0;
	if(!sqliteValue)
		return nil;
	
	return [NSString stringWithUTF8String:(char const*)sqliteValue];
}

@end

//
// database
//
@implementation SQLiteDatabase

//
// init with file
//
- (id)initWithFileName:(NSString *)fileName
{
	//
	// call super
	//
	self																	= [super init];
	if(!self)
		return nil;
	
	//
	// open database
	//
	if(sqlite3_open([fileName UTF8String], &_database) != SQLITE_OK && _database)
	{
		sqlite3_close(_database);
		_database															= 0;
	}
	
	return self;
}

//
// dealloc
//
- (void)dealloc
{
	if(_database)
		sqlite3_close(_database);
	
	[super dealloc];
}

//
// prepare statement
//
- (SQLiteStatement*)prepareStatement:(NSString*)format, ...
{
	if(!_database)
		return nil;
	
	va_list argList;
	va_start(argList, format);
	NSString* sqlString														= [[[NSString alloc] initWithFormat:format arguments:argList] autorelease];
	va_end(argList);
	
	char const* sqlString8													= [sqlString UTF8String];
	sqlite3_stmt* statement													= 0;
	if(sqlite3_prepare_v2(_database, sqlString8, strlen(sqlString8) + 1, &statement, 0) != SQLITE_OK)
		return nil;
	
	return [[[SQLiteStatement alloc] initWithStatement:statement] autorelease];
}

//
// escape string
//
+ (NSString*)escapeString:(NSString*)sqlString
{
	if(!sqlString)
		return @"NULL";
	
	char* result															= sqlite3_mprintf("%Q", [sqlString UTF8String]);
	NSString* retValue														= [NSString stringWithUTF8String:result];
	sqlite3_free(result);
	return retValue;
}

@end
